\bibliographystyle{gbt7714-2005}

\chapter{R语言语法基础}

任何一门编程语言，都会定义自己的规则，其中变量、运算和控制是编程语言最基本的要素，在这一章节，我们将学习R语言在变量定义和类型、数据运算和流程控制三个方面的基础知识。
\section{对象} % (fold)
\label{sec:对象}
每种编程语言都提供访问存储在内存中数据的方式，不同于其他编程语言，R并不能直接访问内存数据，但是提供了“对象”的机制来结构化内存中的数据，通过对象来访问数据。这是R语言非常不同于其他语言的地方。

\subsection{对象的基本类型} % (fold)
\subsubsection{向量} % (fold)
\label{ssub:向量}
向量是由相同基本类型元素组成的序列，相当于一维数组，可视为含有数据的连续单元格。单元格中的数据可以通多索引操作符来获取，比如x[5]。R语言中有六种基本的向量类型：逻辑型（logical）、整型（integer）、实数（real）、复数（complex）、字符串（string）和原型（raw）。在R语言中，整型和实数之间的区别并不是十分重要。\cite{CRAN，2017}使用大写字母L可以创建整型数据：

\begin{lstlisting}
> 1L
[1]
\end{lstlisting}

如果我们要创建一个由5个数值组成的向量x，这5个值分别是1，3，5，7，9。R中的命令是：

\begin{lstlisting}
x = c(1,3,5,7,9)
\end{lstlisting}

这里的函数c()可以有任意多个参数，而它输出的值则是一个把这些参数首尾相连形成的一个向量。

R语言的赋值符号除了“=”之外，还有“->”和“<-”，建议使用“<-”作为赋值符号。

除此之外，我们还可以使用vector函数来创建向量：

\begin{lstlisting}
x <- vector("real", length = 10)
\end{lstlisting}

上述语句将创建一个长度为10，各个元素为实数的空向量。

可以使用typeof或者class函数得到R中对象的类型。

\begin{lstlisting}
> typeof(x)
[1] "double"
\end{lstlisting}

\subsubsection{矩阵} % (fold)
\label{ssub:矩阵}
矩阵是将数据用行和列排列的长方形表格，它是二维的数组，其单元格必须是相同的数据类型。通常用列表示不同的变量，用行来表示各个对象。可以使用matrix函数创建矩阵：

\begin{lstlisting}
> matrix(2, nrow = 2, ncol = 3)
     [,1] [,2] [,3]
[1,]    2    2    2
[2,]    2    2    2
\end{lstlisting}

上述语句将创建一个2行3列，元素全部都是2的矩阵。
% subsubsection 矩阵 (end)

\subsubsection{数组} % (fold)
\label{ssub:数组}
数组与矩阵类似，但是维度可以大于2。使用array函数创建数组：

\begin{lstlisting}
> array(1:24,dim = c(2,3,4))
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

, , 3

     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18

, , 4

     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24

\end{lstlisting}

上述的语句将创建一个用1-24之间数字填充的三维数组。

% subsubsection 数组 (end)
\subsubsection{列表} % (fold)
\label{ssub:列表}
列表是另外一种数据存储形式，列表中的元素可以是R对象中的任何一种。也就是说，列表用于组织多种类型的数据。比如不同班级、不同性别的学生成绩之类的数据。

使用list函数创建列表：
\begin{lstlisting}
> x = c(1,1,2,2,3,3,4,4)
> y = c('男',"女",'男',"女",'男',"女",'男',"女")
> z = c(80,85,89,88,80,85,89,88)
> totalScore = list(class=x, sex=y,score=z)
> totalScore
$class
[1] 1 1 2 2 3 3 4 4

$sex
[1] "男" "女" "男" "女" "男" "女" "男" "女"

$score
[1] 80 85 89 88 80 85 89 88
\end{lstlisting}

\subsection{对象的属性} % (fold)
\label{sub:属性}
对象的常用属性有名称（name）、维度（dimensions）、类型（class）、长度（length）。
\subsection{特殊的组合对象} % (fold)
\label{sub:特殊的组合对象}
\subsubsection{因子} % (fold)
\label{ssub:因子}
因子（factor）是用来处理分类数据的，比如性别这个变量就有男和女两个类别。使用factor函数来创建因子：

\begin{lstlisting}
> y = c('男',"女",'男',"女",'男',"女",'男',"女")
> f = factor(y)
> f
[1] 男 女 男 女 男 女 男 女
Levels: 男 女
\end{lstlisting}

上述语句根据y向量值的情况，创建了一个包含有两个值的因子f。

% subsubsection 因子 (end)
\subsubsection{数据框} % (fold)
\label{ssub:数据框}
数据框（data frame）主要用来存储表格数据，可以视为各个元素长度相同的列表，每个元素代表一列数据，元素的长度就是行数，既然是列表，当然其元素类型可以不同。数据框是进行数据分析是最主要的数据结构类型。

\section{运算及表达式} % (fold)
\label{sec:运算及表达式}
在编程语言中，所有的表达式有应该有个值。我们先从简单的表达式开始学习。
\subsection{简单表达式} % (fold)
\label{sub:简单表达式}
\subsubsection{常数} % (fold)
\label{ssub:常数}
在控制台中直接键入数字，就是常数：

\begin{lstlisting}
> 1
[1] 1
\end{lstlisting}

\subsubsection{变量名} % (fold)
\label{ssub:变量名}
当一个变量被创建时，必须给它一个名字，这个名字叫做symbol，symbol也是对象，在R语言中，所有的东西都是对象。

\begin{lstlisting}
y = 4
\end{lstlisting}

在这个例子中，y是个symbol，它的值是4。

\subsubsection{操作符} % (fold)
\label{ssub:操作符}

R语言有一系列运算符：

\begin{lstlisting}

- Minus, can be unary or binary
+ Plus, can be unary or binary
! Unary not
~ Tilde, used for model formulae, can be either unary or binary
? Help
: Sequence, binary (in model formulae: interaction)
* Multiplication, binary
/ Division, binary
^ Exponentiation, binary
%x% Special binary operators, x can be replaced by any valid name
%%  Modulus, binary
%/% Integer divide, binary
%*% Matrix product, binary
%o% Outer product, binary
%x% Kronecker product, binary
%in%  Matching operator, binary (in model formulae: nesting)
< Less than, binary
> Greater than, binary
==  Equal to, binary
>=  Greater than or equal to, binary
<=  Less than or equal to, binary
& And, binary, vectorized
&&  And, binary, not vectorized
| Or, binary, vectorized
||  Or, binary, not vectorized
<-  Left assignment, binary
->  Right assignment, binary
$ List subset, binary
\end{lstlisting}

% subsubsection 操作符 (end)

\section{流程控制} % (fold)
\label{sec:流程控制}
\subsection{if} % (fold)
\label{sub:if}
if else语句可以根据不同条件允许不同的语句块：

\begin{lstlisting}
if ( statement1 )
    statement2
else
    statement3
\end{lstlisting}

当然，也可以嵌套：

\begin{lstlisting}
if ( statement1 ) {
    statement2
} else if ( statement3 ) {
    statement4
} else if ( statement5 ) {
    statement6
} else
    statement8
\end{lstlisting}

\subsection{循环} % (fold)
\label{sub:循环}
\subsubsection{for} % (fold)
\label{ssub:for}
for循环语法：

\begin{lstlisting}
for ( name in vector )
   statement1
\end{lstlisting}

\subsubsection{while} % (fold)
\label{ssub:while}

\begin{lstlisting}
while ( statement1 ) statement2
\end{lstlisting}

% subsubsection while (end)
% subsubsection for (end)
% subsection 循环 (end)
% subsection if (end)
\section{函数} % (fold)
\label{sec:函数}
除了R自带的函数之外，用户可以自己根据需要创建函数，语法如下：

\begin{lstlisting}
function ( arglist ) body
\end{lstlisting}

比如，我们编写一个没有参数的函数：

\begin{lstlisting}
> welcome = function() print("Welcome to using R")
> welcome
function() print("Welcome to using R")
> welcome()
[1] "Welcome to using R"
\end{lstlisting}

从上面的代码运行结果可以看出，函数的定义使用function关键字，调用时要用括号。

还可以在定义函数的时候设置参数：

\begin{lstlisting}
> welcome = function(name) print(paste("Welcome to using R!,", name))
> welcome('Yang')
[1] "Welcome to using R!, Yang"
\end{lstlisting}

上述函数中paste函数用来连接字符串，详细用法可以参看手册。

\subsection{函数调用} % (fold)
\label{sub:函数调用}
在R中，大多数表达式都和函数调用有关。函数通过函数名和其必要的参数值进行调用：

\begin{lstlisting}
> mean(c(1,2,3))
[1] 2
\end{lstlisting}
% section 函数 (end)
\bibliography{../bib/yangjh}
